﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FaultBackService.BLL
{
    /// <summary>
    /// 趋势分析中，处理传感器的稳定值集合的基类
    /// </summary>
    public abstract class TrendSensorData
    {
        internal IList<Models.TrendStableTime> _stableTimeList;   //风机稳定功率时间戳集合
        internal IDictionary<int, Models.Turbine> _dictTurbine;   //风机字典

        public TrendSensorData(IList<Models.TrendStableTime> stableTimeList)
        {
            _stableTimeList = stableTimeList;
            _dictTurbine = new Turbine().GetDict();
        }

        /// <summary>
        /// 获取传感器数据的稳定值集合(不同趋势模式，不同风机)
        /// </summary>
        /// <returns></returns>
        public abstract IList<Models.TrendStableValue> GetStableValueList();


        /// <summary>
        /// 获取稳定值集合，并写入数据库
        /// </summary>
        public int GetStableValueListAndWriteToDB()
        {
            var stableValueList = GetStableValueList();
            if (stableValueList.Count > 0)
            {
                return new TrendStableValue().AddRange(stableValueList);
            }
            else
            {
                return 0;
            }
        }
    }

    /// <summary>
    /// 处理齿轮箱温度的趋势数据
    /// (SersorId=1;SersorName=@"齿轮箱温度";ComponentId=5;ComponentName=@"主传动链")
    /// </summary>
    public class Trend_GBox : TrendSensorData
    {
        IList<Models.t_TurbDataGeneric2> _tenMeanDataList;
        public Trend_GBox(IList<Models.TrendStableTime> stableTimeList,IList<Models.t_TurbDataGeneric2> tenMeanDataList)
            : base(stableTimeList)
        {
            _tenMeanDataList = tenMeanDataList;
        }

        public override IList<Models.TrendStableValue> GetStableValueList()
        {
            var stableValueList = new List<Models.TrendStableValue>();
            if (_stableTimeList!=null && _stableTimeList.Count!=0)
            {
                foreach (var data in _tenMeanDataList)
                {
                    if (data.GBoxDegC_Mean!=null && data.GBoxDegC_Mean!=0)   //稳定值存在且不为0
                    {
                        var list = _stableTimeList.Where(t => t.TimeStamp == data.TStampOfMidPoint).ToList();
                        if (list.Count > 0)
                        {
                            foreach (var timeItem in list)
                            {
                                var stableValue = new Models.TrendStableValue();
                                stableValue.TurbineId = timeItem.TurbineId;
                                stableValue.TurbineName = _dictTurbine[timeItem.TurbineId].TurbineName;
                                stableValue.ComponentId = 5;
                                stableValue.ComponentName = @"主传动链";
                                stableValue.SensorId = 1;
                                stableValue.SensorName = @"齿轮箱温度";
                                stableValue.ModelId = timeItem.TrendModelId;
                                stableValue.PowerPoint = timeItem.PowerPoint;
                                stableValue.Accuracy = timeItem.Accuracy;
                                stableValue.TimeRange = timeItem.TimeRange;
                                stableValue.Date = timeItem.TimeStamp.Date;
                                stableValue.TimeStamp = timeItem.TimeStamp;
                                stableValue.RealPower = timeItem.RealPower;
                                stableValue.StableValue = data.GBoxDegC_Mean.GetValueOrDefault();

                                stableValueList.Add(stableValue);
                            }
                        }
                    }
                }
            }
            
            return stableValueList;
        }
    }

    /// <summary>
    /// 处理发电机温度的趋势数据
    /// (SersorId=2;SersorName=@"发电机温度";ComponentId=5;ComponentName=@"主传动链")
    /// </summary>
    public class Trend_Gen : TrendSensorData
    {
        IList<Models.t_TurbDataGeneric2> _tenMeanDataList;
        public Trend_Gen(IList<Models.TrendStableTime> stableTimeList, IList<Models.t_TurbDataGeneric2> tenMeanDataList)
            : base(stableTimeList)
        {
            _tenMeanDataList = tenMeanDataList;
        }

        public override IList<Models.TrendStableValue> GetStableValueList()
        {
            var stableValueList = new List<Models.TrendStableValue>();
            if (_stableTimeList != null && _stableTimeList.Count != 0)
            {
                foreach (var data in _tenMeanDataList)
                {
                    if (data.GBoxDegC_Mean != null && data.GBoxDegC_Mean != 0)   //稳定值存在且不为0
                    {
                        var list = _stableTimeList.Where(t => t.TimeStamp == data.TStampOfMidPoint).ToList();
                        if (list.Count > 0)
                        {
                            foreach (var timeItem in list)
                            {
                                var stableValue = new Models.TrendStableValue();
                                stableValue.TurbineId = timeItem.TurbineId;
                                stableValue.TurbineName = _dictTurbine[timeItem.TurbineId].TurbineName;
                                stableValue.ComponentId = 5;
                                stableValue.ComponentName = @"主传动链";
                                stableValue.SensorId = 2;
                                stableValue.SensorName = @"发电机温度";
                                stableValue.ModelId = timeItem.TrendModelId;
                                stableValue.PowerPoint = timeItem.PowerPoint;
                                stableValue.Accuracy = timeItem.Accuracy;
                                stableValue.TimeRange = timeItem.TimeRange;
                                stableValue.Date = timeItem.TimeStamp.Date;
                                stableValue.TimeStamp = timeItem.TimeStamp;
                                stableValue.RealPower = timeItem.RealPower;
                                stableValue.StableValue = data.GenDegC_Mean.GetValueOrDefault();

                                stableValueList.Add(stableValue);
                            }
                        }
                    }
                }
            }

            return stableValueList;
        }
    }

}
